package com.atguigu.gmall.cart.controller;

import com.atguigu.gmall.cart.bean.CartInfo;
import com.atguigu.gmall.cart.service.CartService;
import com.atguigu.gmall.common.bean.ResponseVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RequestMapping
public class CartController {
    @Autowired
    CartService cartService;
    @ApiOperation("查询用户已选中的购物项列表")
    @ResponseBody
    @GetMapping("queryCheckedCarts/{userId}")
    public ResponseVo<List<CartInfo>> queryCheckedCarts(@PathVariable("userId")String userId){
        List<CartInfo> cartInfos = cartService.queryCheckedCarts(userId);
        return ResponseVo.ok(cartInfos);
    }
    //http://cart.gmall.com/batchUpdateCheckStatus?skuIds=2,1&status=false
    @ApiOperation("批量更新购物项状态")
    @ResponseBody
    @PostMapping("batchUpdateCheckStatus")
    public ResponseVo batchUpdateCheckStatus(@RequestParam("skuIds")List<String> skuIds ,
                                             @RequestParam("status")Boolean status){
        cartService.batchupdateCartInfoStatus(skuIds , status);

        return ResponseVo.ok();

    }
    //http://cart.gmall.com/updateStatus
    @ApiOperation("更新购物项选中状态")
    @ResponseBody
    @PostMapping("updateStatus")
    public ResponseVo updateCartInfoStatus(@RequestBody CartInfo cartInfo){
        Boolean flag = cartService.updateCartInfoStatus(cartInfo);
        if(flag){
            return ResponseVo.ok();
        }
        return ResponseVo.fail("更新失败");
    }
    //http://cart.gmall.com/deleteCart?skuId=2
    @ApiOperation("删除购物项")
    @ResponseBody
    @PostMapping("deleteCart")
    public ResponseVo deleteCartInfo(@RequestParam("skuId") String skuId){
        Boolean flag = cartService.deleteCartInfo(skuId);
        if(flag){
            return ResponseVo.ok();
        }
        return ResponseVo.fail("删除失败");
    }
    //http://cart.gmall.com/updateNum
    @ApiOperation("更新购物项数量")
    @ResponseBody
    @PostMapping("updateNum")
    public ResponseVo updateCartInfoNum(@RequestBody CartInfo cartInfo){
        Boolean flag = cartService.updateCartInfoNum(cartInfo);
        if(flag){
            return ResponseVo.ok();
        }
        return ResponseVo.fail("更新失败");
    }
    //商品详情页点击加入购物车时 页面发起的请求：  目的是将skuId为3的商品添加到购物车中
    //http://cart.gmall.com/?skuId=3&count=1
//    @ResponseBody
    @GetMapping("/")
    public String add2Cart(@RequestParam("skuId") String skuId,
                           @RequestParam("count")Integer count){
        //有userId使用userId，没有使用userKey
        //有userId时 我们的业务如果是查询购物车 还需要使用userKey查询是否存在未登录的购物车
        cartService.add2Cart(skuId,count);
        return "redirect:http://cart.gmall.com/addCart.html?skuId="+skuId;
    }
    //添加那个商品到购物车成功  点击可以查看购物车所有数据
    //查询添加到购物车中的购物项的数据 交给页面展示
    @GetMapping("addCart.html")
    public String addCart(@RequestParam("skuId")String skuId , Model model){
        CartInfo cartInfo = cartService.queryCartInfoBySkuId(skuId);
        model.addAttribute("cart",cartInfo);
        return "addCart";
    }
    //购物车
    @GetMapping("cart.html")
    public String cart(Model model){
        List<CartInfo> cartInfos = cartService.queryCarts();
        //carts:购物项集合
        model.addAttribute("carts" , cartInfos);
        return "cart";
    }
//    @ResponseBody
//    @GetMapping("test")
//    public ResponseVo test(){
//
//        long start = System.currentTimeMillis();
//        //以下的两个业务方法 执行的结果不会影响当前的业务方法 可以异步执行
//        //同步接收异步任务的结果 无法获取
//        cartService.exec1().addCallback(r ->{//异步任务成功的回调
//            System.out.println("exec1执行结束： r = "+r);
//        },e->{//异步任务失败的回调
//            System.out.println("exec1执行出现异常： e = "+e.getMessage());
//        });
//        cartService.exec2().addCallback(r ->{//异步任务成功的回调
//            System.out.println("exec2执行结束： r = "+r);
//        },e->{//异步任务失败的回调
//            System.out.println("exec2执行出现异常： e = "+e.getMessage());
//        });
//        //当前主业务方法最后需要使用exec1和exec2执行的结果
////            System.out.println("exec1 = " + exec1.get() + " exec2 = "+ exec2.get());
//        System.out.println("test执行结束：耗时 = "+ (System.currentTimeMillis()-start));
//
//        return ResponseVo.ok();
//    }

    @ResponseBody
    @GetMapping("test")
    public ResponseVo test(){
        //异步任务执行，主任务不使用异步任务的结果，但是异步任务如果出现异常需要记录异常的日志
        long start = System.currentTimeMillis();
        cartService.exec1();
        cartService.exec2();
        //System.out.println("exec1 = " + exec1.get() + " exec2 = "+ exec2.get());
        System.out.println("test执行结束：耗时 = "+ (System.currentTimeMillis()-start));
        return ResponseVo.ok();
    }
}
